from datetime import datetime
import hashlib
import json
import requests


# 核心数据 body + app_key + app_secret + 商户编号 + API版本

app_key = "dadac06d1e38614cfce"
app_secret = "68d8a3690443b4d36481cc4d6c0ad3bc"
# 商户编号
source_id = "73753"
# API版本
api_version = "1.0"

# 查询门店接口
shop_detail_body = {
"origin_shop_id":11047059
}

"""在测试环境，使用统一商户和门店进行发单。其中，商户id：73753，门店编号：11047059。
shop_no	String	是	门店编号，门店创建后可在门店列表和单页查看
origin_id	String	是	第三方订单ID
city_code	String	是	订单所在城市的code（查看各城市对应的code值）
cargo_price	Double	是	订单金额
is_prepay	Integer	是	是否需要垫付 1:是 0:否 (垫付订单金额，非运费)
expected_fetch_time	Long	是	期望取货时间（1.时间戳,以秒计算时间，即unix-timestamp; 2.该字段的设定，不会影响达达正常取货; 3.订单待接单时,该时间往后推半小时后，会自动被系统取消;4.建议取值为当前时间往后推10~15分钟）
receiver_name	String	是	收货人姓名
receiver_address	String	是	收货人地址
receiver_lat	Double	是	收货人地址维度（高德坐标系）
receiver_lng	Double	是	收货人地址经度（高德坐标系）
callback	String	是	回调URL（查看回调说明）
receiver_phone	String	否	收货人手机号（手机号和座机号必填一项）
"""
# 发送配送单接口
add_order_body = {
    "shop_no":11047059,
    # 第三方订单号
    "origin_id":"A0B0C1",
    "city_code":"027",
    "cargo_price": 50,
    "is_prepay":0,
    "expected_fetch_time":str(int(datetime.now().timestamp()) + 3600),
    "receiver_name": "刘超",
    "receiver_address": "收货人地址",
    "receiver_lat": 30.434272,
    "receiver_lng": 114.423492,
    "callback": "http://lbs.amap.com/console/show/picker",
    "receiver_phone" : "13986100814"
}

# 接受订单(仅在测试环境供调试使用)
accept_order_body = {
    "order_id":"A0B0C1"
}

# 接受订单(仅在测试环境供调试使用)
order_detail_body = {
    "order_id":"A0B0C1"
}




# 关键字参数
# *, order_number, api_type
def post_dada_api(**order_dict):
    order_number = order_dict["order_number"]
    api_type = order_dict["api_type"]
    post_json = {
        "order_id": order_number
    }
    post_json_str = get_post_json(post_json)
    type_api_dict = {
        1: "/api/order/accept",
        2: "/api/order/fetch",
        3: "/api/order/finish",
        4: "/api/order/cancel",
        5: "/api/order/expire"
    }
    pre_url = "newopen.qa.imdada.cn" # 达达测试接口前缀
    dict = json.loads(post_json_str)
    url = "http://" + pre_url + type_api_dict[int(api_type)]
    headers = {'Content-Type': 'application/json'}
    # url = "http://127.0.0.1:5000"
    r = requests.post(url, data = json.dumps(dict),headers = headers)
    return r.text


def get_post_json(body, app_key = app_key, app_secret = app_secret, source_id = source_id, api_version = "1.0"):
    data = {}
    body_str = json.dumps(body)
    data["body"] = body_str

    # 基础数据
    data["format"] = "json"
    timestamp = str(int(datetime.now().timestamp()))
    data["timestamp"] = timestamp
    # 应用Key，对应开发者账号中的app_key
    data["app_key"] = app_key
    # API版本
    data["v"] = api_version
    # 商户编号（创建商户账号分配的编号） 测试环境默认为：73753
    data["source_id"] = "73753"

    # dict.keys() 返回dict_keys类型 不能使用sort排序 需要使用list()转成list
    order_json_keys = list(data.keys())
    order_json_keys.sort()
    order_json = {}
    for key in order_json_keys:
        order_json[key] = data[key]

    # 将 字典 进行key和value字符串拼接
    dict_str = ''
    for key, value in order_json.items():
        dict_str = dict_str + key + value

    # 将拼接后的字符串首尾加上app_secret秘钥，合成签名字符串
    signature_str = app_secret + dict_str + app_secret

    # 对签名字符串进行MD5加密，生成32位的字符串 并upper()大写
    signature_md5 = hashlib.md5(signature_str.encode('utf-8')).hexdigest().upper()

    # 返回 添加 签名 后的json_str
    data["signature"] = signature_md5
    # dict 转 str
    signed_json_str = json.dumps(data)
    return signed_json_str






